#include "can_driver.h"

// CAN过滤器配置 - 匹配所有ID
uint8_t CAN_Filter_Config(void)
{
  CAN_FilterTypeDef canfilter;

  // 配置过滤器0，匹配所有标准ID和扩展ID
  canfilter.FilterBank = 0;                      // 使用过滤器0
  canfilter.FilterMode = CAN_FILTERMODE_IDMASK;  // 掩码模式
  canfilter.FilterScale = CAN_FILTERSCALE_32BIT; // 32位模式
  canfilter.FilterIdHigh = 0x0000;               // ID高16位
  canfilter.FilterIdLow = 0x0000;                // ID低16位  
  canfilter.FilterMaskIdHigh = 0x0000;           // 掩码高16位 - 全0表示不检查
  canfilter.FilterMaskIdLow = 0x0000;            // 掩码低16位 - 全0表示不检查
  canfilter.FilterFIFOAssignment = CAN_RX_FIFO0; // 分配到FIFO0
  canfilter.FilterActivation = ENABLE;           // 启用过滤器
  canfilter.SlaveStartFilterBank = 14;           // 从过滤器bank数

  if (HAL_CAN_ConfigFilter(&hcan1, &canfilter) != HAL_OK)
  {
    return 1; // 配置失败
  }
  
  return 0; // 配置成功
}

// CAN消息发送函数
uint8_t CAN_Send_Msg(uint32_t id, uint8_t* data, uint8_t len, uint8_t ext_id)
{
  CAN_TxHeaderTypeDef tx_header;
  uint32_t tx_mailbox;
  uint8_t tx_data[8];
  
  if (len > 8) len = 8; // CAN帧最多8字节
  
  // 填充数据
  for (int i = 0; i < len; i++) {
    tx_data[i] = data[i];
  }
  
  // 配置发送头
  if (ext_id) {
    tx_header.ExtId = id;                    // 扩展ID
    tx_header.IDE = CAN_ID_EXT;              // 扩展ID模式
  } else {
    tx_header.StdId = id;                    // 标准ID
    tx_header.IDE = CAN_ID_STD;              // 标准ID模式
  }
  
  tx_header.RTR = CAN_RTR_DATA;              // 数据帧
  tx_header.DLC = len;                       // 数据长度
  tx_header.TransmitGlobalTime = DISABLE;
  
  // 开始发送
  if (HAL_CAN_AddTxMessage(&hcan1, &tx_header, tx_data, &tx_mailbox) != HAL_OK) {
    return 1; // 发送失败
  }
  
  return 0; // 发送成功
}

// FIFO0接收中断回调函数
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan){
    CAN_RxHeaderTypeDef rxHeader;
    uint8_t rxData[9];
    
    // 读取接收到的消息
    if (HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &rxHeader, rxData) == HAL_OK)
    {
        // 处理接收到的数据
        
        // 你的处理逻辑...
				printf("Received ID: 0x%03X, Data: ", rxHeader.StdId);
				for(int i=0; i<rxHeader.DLC; i++){
					printf("%02X ", rxData[i]);
				}
				printf("\n");
    }
}
